home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr05 / xnot12a.zip / TTYKBD.C < prev    next >
C/C++ Source or Header  |  1993-06-04  |  10KB  |  398 lines

  1. #include "jam.h"
  2. #include "def.h"
  3.  
  4. #ifndef WINDOWED
  5. # ifndef CURSES
  6. #  include    <dos.h>
  7. # endif
  8.  
  9. # ifdef MSC
  10. #  include    <bios.h>
  11. # endif /* MSC */
  12. #endif
  13.  
  14. #define KMETA METABIT
  15.  
  16. #ifdef CURSES
  17.  static int rn_(mapCursesKey, (int foo));
  18. #endif
  19.  
  20. static CONSTANT char *keystrings[] = {
  21.     "Home",        "Down-Arrow",    "Up-Arrow",    "Left-Arrow",
  22.     "Right-Arrow",    "Page-Up",    "Page-Down",    "End",
  23.     "Delete",    "Insert",    "Control-Left", "Control-Right",
  24.     "Control-PgUp",    "Control-PgDn",    "Control-Home",    "Control-End",
  25.     "F1",        "F2",        "F3",        "F4",
  26.     "F5",        "F6",        "F7",        "F8",
  27.     "F9",        "F10",        "FS1",        "FS2",
  28.     "FS3",        "FS4",        "FS5",        "FS6",
  29.     "FS7",        "FS8",        "FS9",        "FS10",
  30.     "FC1",        "FC2",        "FC3",        "FC4",
  31.     "FC5",        "FC6",        "FC7",        "FC8",
  32.     "FC9",        "FC10",         
  33.  
  34. #if defined(WINDOWED) || defined(CURSES)
  35.         "F11",          "FS11",          "FC11",         "F12",          
  36.         "FS12",         "FC12",         
  37.         "Num-Lock",    "KP-/",           "KP-*",         "KP--",
  38.     "KP-7",         "KP-8",          "KP-9",         "KP-+",
  39.     "KP-4",         "KP-5",         "KP-6",         
  40.         "KP-1",        "KP-2",          "KP-3",         "KP-Enter",     
  41.     "KP-0",        "KP-.",
  42.  
  43.  /* Of course someone wanted these added AFTER I got the 
  44.  * keypad, etc added in so the order is all messed up. Not worth my
  45.  * time to fix all the .h files and this table...sorry   (JAM)
  46.  */
  47.     "FM1",        "FM2",        "FM3",        "FM4",
  48.     "FM5",        "FM6",        "FM7",        "FM8",
  49.     "FM9",        "FM10",        "FM11",        "FM12",
  50.     "FCS1",        "FCS2",        "FCS3",        "FCS4",
  51.     "FCS5",        "FCS6",        "FCS7",        "FCS8",
  52.     "FCS9",        "FCS10",    "FCS11",    "FCS12",
  53.  
  54.         "",    /* KEXTEND, invisible and untypeable! */
  55.  
  56.         "KFind",    "KSelect",    "KSFind",    "KSSelect",
  57. #endif
  58. };
  59.  
  60. /* I like my tables static thus this access function.
  61. * Caller assumed to be well behaved, no range checking (JAM)
  62. */
  63. CONSTANT char *getkeystrings(i)
  64. int i;
  65. {
  66.   return(keystrings[i]);
  67. }
  68.  
  69.  
  70. /* Convert IBM bios extended scan codes to appropriate function key values 
  71. */
  72. #ifndef WINDOWED
  73. static CONSTANT KCHAR extended[] = {
  74.     -1,        -1,        -1,        0,      /* 0-3 */
  75.     -1,        -1,        -1,        -1,      /* 4-7 */
  76.     -1,        -1,        -1,        -1,      /* 8-11 */
  77.     -1,        -1,        -1,        -1,      /* 12-15 */
  78.     KMETA|'Q',    KMETA|'W',    KMETA|'E',    KMETA|'R',/* 16-19 */
  79.     KMETA|'T',    KMETA|'Y',    KMETA|'U',    KMETA|'I',/* 20-23 */
  80.     KMETA|'O',    KMETA|'P',    -1,        -1,      /* 24-27 */
  81.     -1,        -1,        KMETA|'A',    KMETA|'S',/* 28-31 */
  82.     KMETA|'D',    KMETA|'F',    KMETA|'G',    KMETA|'H',/* 32-35 */
  83.     KMETA|'J',    KMETA|'K',    KMETA|'L',    -1,      /* 36-39 */
  84.     -1,        -1,        -1,        -1,      /* 40-43 */
  85.     KMETA|'Z',    KMETA|'X',    KMETA|'C',    KMETA|'V',/* 44-47 */
  86.     KMETA|'B',    KMETA|'N',    KMETA|'M',    -1,      /* 48-51 */
  87.     -1,        -1,        /* oops - miscounted */      /* 52-53 */
  88.     -1,        -1,        -1,        -1,      /* 54-57 */
  89.     -1,        KF1,        KF2,        KF3,      /* 58-61 */
  90.     KF4,        KF5,        KF6,        KF7,      /* 62-65 */
  91.     KF8,        KF9,        KF10,        -1,      /* 66-69 */
  92.     -1,        KHOME,        KUP,        KPGUP,      /* 70-73 */
  93.     -1,        KLEFT,        -1,        KRIGHT,      /* 74-77 */
  94.     -1,        KEND,        KDOWN,        KPGDN,      /* 78-81 */
  95.     KINSERT,    KDELETE,    KSF1,        KSF2,      /* 82-85 */
  96.     KSF3,        KSF4,        KSF5,        KSF6,      /* 86-89 */
  97.     KSF7,        KSF8,        KSF9,        KSF10,      /* 90-93 */
  98.     KCF1,        KCF2,        KCF3,        KCF4,      /* 94-97 */
  99.     KCF5,        KCF6,        KCF7,        KCF8,      /* 98-101 */
  100.     KCF9,        KCF10,        KMETA|KF1,    KMETA|KF2,/* 102-105 */
  101.     KMETA|KF3,    KMETA|KF4,    KMETA|KF5,    KMETA|KF6,/* 106-109 */
  102.     KMETA|KF7,    KMETA|KF8,    KMETA|KF9,    KMETA|KF10,/* 110-113 */
  103.     -1,        KCLEFT,        KCRIGHT,    KCEND,      /* 114-117 */
  104.     KCPGDN,        KCHOME,        KMETA|'1',    KMETA|'2',/* 118-121 */
  105.     KMETA|'3',    KMETA|'4',    KMETA|'5',    KMETA|'6',/* 122-125 */
  106.     KMETA|'7',    KMETA|'8',    KMETA|'9',    KMETA|'0',/* 126-129 */
  107.     KMETA|'-',    KMETA|'=',    KCPGUP,              /* 130-132 */
  108. };
  109. #endif
  110.  
  111. #define NEXTENDED (sizeof(extended)-sizeof(KCHAR))
  112.  
  113. static KCHAR savedkey = -1;
  114.  
  115. getkbd() 
  116. {
  117.   return (ttgetc());
  118. }
  119.  
  120. /*
  121.  * Get keyboard character, and interpret
  122.  * any special keys on the keyboard.
  123.  */
  124. ttgetc() 
  125. {
  126.   KCHAR temp;
  127.   
  128.   while (savedkey == -1)
  129.     getakey();
  130.   
  131.   temp = savedkey;
  132.   savedkey = -1;
  133.   return temp;
  134. }
  135.  
  136. getakey() 
  137. {
  138. #ifdef WINDOWED    /* JAM */
  139.   WindowGetEvent((void *)&savedkey);
  140. #else /* WINDOWED */
  141.  
  142. # ifdef CURSES
  143.   int foo;
  144.   long currtime;
  145.   KCHAR kchar;
  146.   static long lasttime = 0;
  147.   struct tm *timestruct1, *timestruct2;
  148.   
  149.   /* check for input in internal queue before 
  150.   * checking hardware queue
  151.   */
  152. queued:
  153.   if (DOSReturnKCHAR(&kchar))
  154.     {
  155.      savedkey = kchar;
  156.      return (TRUE);
  157.     }
  158.  
  159.   if (lasttime == 0)
  160.     time(&lasttime);
  161.  
  162.   /* See if input, else do timeouts; this is kind of expensive
  163.   */
  164.   while (1)
  165.     {
  166.       time(&currtime);
  167.       timestruct1 = localtime(&lasttime);
  168.       timestruct2 = localtime(&currtime);
  169.       if (timestruct2->tm_sec - timestruct1->tm_sec >= TIME_INC)
  170.         {
  171.           DoTimer();
  172.           lasttime = 0;   
  173.         }
  174.       foo = wgetch(stdscr);
  175.       if (foo != ERR)
  176.         break;
  177.  
  178.       foo = mapCursesKey(foo);
  179.       if (foo == KEY_MIN)
  180.         goto queued;        /* ugh! goto */
  181.     }
  182.   savedkey = foo;
  183. # else
  184.  
  185.   union REGS rg;
  186.   KCHAR kchar;
  187.  
  188.   /* check for input in internal queue before 
  189.   * checking hardware queue
  190.   */
  191.   if (DOSReturnKCHAR(&kchar))
  192.     {
  193.      savedkey = kchar;
  194.      return (TRUE);
  195.     }
  196.  
  197.   rg.h.ah = 0;                /* read keyboard */
  198.   /* rg.h.ah = 0x10;                 read enhanced keyboard */
  199.  
  200.   int86(0x16, &rg, &rg);
  201.  
  202.   if (rg.h.al) 
  203.     {
  204.       if (rg.h.al == '\b' && rg.h.ah == 0x0E)
  205.     rg.h.al = 0x7F;        /* transform backspace key into delete */
  206.                                 /* control H is still backspace */
  207.       savedkey = rg.h.al;    /* normal key value */
  208.     }
  209.   else 
  210.     {
  211.       if (rg.h.ah >= NEXTENDED)
  212.       savedkey = -1;
  213.       else
  214.     savedkey = extended[rg.h.ah];
  215.     }
  216. # endif /* CURSES */
  217. #endif /* WINDOWED */
  218.  return TRUE;
  219. }
  220.  
  221. #ifndef WINDOWED    /* not needed */
  222. pollkbd()
  223. {
  224. # ifdef MSC
  225.     return _bios_keybrd(_KEYBRD_READY);
  226. # else 
  227. # ifdef CURSES
  228.     return(FALSE);
  229. # else
  230.     return bioskey(1);
  231. # endif /* CURSES */
  232. # endif /* MSC */
  233. }
  234. #endif
  235.  
  236. /* See if events pending; used only by display.c (update)
  237. * to forstall screen update in deference to handling input. 
  238. *
  239. * For Windows, lookahead only for events which cause another redraw
  240. * else not updating makes cursor motion jumpy.
  241. */
  242. mytypeahead() 
  243. {
  244. #ifdef WINDOWED
  245.   return (WindowLookaheadEvent());
  246. #else
  247.   if (savedkey != -1)
  248.     return 1;
  249.  
  250.   if (pollkbd())
  251.     getakey();
  252.   return (savedkey != -1);
  253. #endif
  254. }
  255.  
  256. ttykeymapinit() 
  257. {
  258.   /* mg 2a no longer lets me easily bind things at run time. */
  259.   /* instead, I make up a keymap, and link it in at compile time */
  260.  return TRUE;
  261. }
  262.  
  263. PF ibm_keys[] = {
  264.     gotobol,    /* Home                */
  265.     forwline,    /* Down                */
  266.     backline,    /* Up                */
  267.     backchar,    /* Left                */
  268.     forwchar,    /* Right            */
  269.     backpage,    /* Page Up            */
  270.     forwpage,    /* Page Dn            */
  271.     gotoeol,    /* End                */
  272.         forwdel,        /* Delete            */
  273.     openline,    /* Insert            */
  274.     backword,    /* Control Left            */
  275.     forwword,    /* Control Right        */
  276.     gotobob,    /* Control PgUp               */
  277.     gotoeob,    /* Control PgDn             */
  278.     gotobop,    /* Control HOME            */
  279.     gotoeop,    /* Control END            */
  280.  
  281.     /* function keys - initially unassigned 
  282.         */
  283.     rescan, rescan, rescan, rescan, rescan, rescan, rescan, rescan,
  284.     rescan, rescan, rescan, rescan, rescan, rescan, rescan, rescan,
  285.     rescan, rescan, rescan, rescan, rescan, rescan, rescan, rescan,
  286.     rescan, rescan, rescan, rescan, rescan, rescan, 
  287.  
  288. #ifdef WINDOWED
  289.         rescan, rescan, rescan,             /* F11                 */
  290.         rescan, rescan, rescan,             /* F12                 */
  291.         rescan, rescan, rescan,rescan,      /* NUMLOCK / * -       */
  292.         rescan, rescan, rescan,rescan,      /* 7 8 9 +             */
  293.         rescan, rescan, rescan,             /* 4 5 6               */
  294.         rescan, rescan, rescan,rescan,      /* 1 2 3 ENTER         */
  295.         rescan, rescan,                     /* 0, DEL              */
  296.         rescan, rescan, rescan, rescan,     /* META F1, F2, F3, F4 */
  297.         rescan, rescan, rescan, rescan,     /* META F5, F6, F7, F8 */
  298.         rescan, rescan, rescan, rescan,     /* META F9, F10, F11, F12 */
  299.         rescan, rescan, rescan, rescan,     /* Cntrl-Shift F1, F2, F3, F4 */
  300.         rescan, rescan, rescan, rescan,     /* Cntrl-Shift F5, F6, F7, F8 */
  301.         rescan, rescan, rescan, rescan,     /* Cntrl-Shift F9, F10, F11, F12 */
  302.  
  303.         silent_extend,        /* KEXTEND, invisible and untypeable */
  304.  
  305.     rescan, rescan, rescan,rescan,       /* KFind, KSelect, & shifted 
  306.                         * (not normally on Windows PC's)
  307.                         */ 
  308.  
  309.  
  310. #endif
  311. };
  312.  
  313. #ifdef CURSES
  314. static int mapCursesKey(c)
  315. int c;
  316. {
  317.   switch(c)
  318.     {
  319.     case KEY_DOWN:
  320.           c = KDOWN;
  321.           break;
  322.     case KEY_UP:
  323.           c = KUP;
  324.           break;
  325.     case KEY_LEFT:
  326.           c = KLEFT;
  327.           break;
  328.     case KEY_SLEFT:
  329.           c = KCLEFT;
  330.           break;
  331.     case KEY_RIGHT:
  332.           c = KRIGHT;
  333.           break;
  334.     case KEY_SRIGHT:
  335.           c = KCRIGHT;
  336.           break;
  337.     case KEY_HOME:
  338.           c = KHOME;
  339.           break;
  340.     case KEY_SHOME:
  341.           c = KCHOME;
  342.           break;
  343.     case KEY_BACKSPACE:
  344.           c = KDELETE;
  345.           break;
  346.           
  347.     case KEY_F(1):
  348.           c = KF1;
  349.           break;
  350.     case KEY_F(2):
  351.           c = KF2;
  352.           break;
  353.     case KEY_F(3):
  354.           c = KF3;
  355.           break;
  356.     case KEY_F(4):
  357.           c = KF4;
  358.           break;
  359.     case KEY_F(5):
  360.           c = KF5;
  361.           break;
  362.     case KEY_F(6):
  363.           c = KF6;
  364.           break;
  365.     case KEY_F(7):
  366.           c = KF7;
  367.           break;
  368.     case KEY_F(8):
  369.           c = KF8;
  370.           break;
  371.     case KEY_F(9):
  372.           c = KF9;
  373.           break;
  374.     case KEY_F(10):
  375.           c = KF10;
  376.           break;
  377.         
  378.     case KEY_NPAGE:
  379.           c = KPGDN;
  380.           break;
  381.  
  382.     case KEY_PPAGE:
  383.           c = KPGUP;
  384.           break;
  385.  
  386.         case KEY_END:
  387.           c = KEND;
  388.           break;
  389.         default:
  390.           if (c >= KEY_MIN)
  391.             c = KEY_MIN;    
  392.           break;
  393.     }
  394.  
  395.   return(c);
  396. }
  397. #endif
  398.